package com.huikeportal.service.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.huikeportal.controller.common.MD5Util;
import com.huikeportal.controller.common.Tools;
import com.huikeportal.dao.AspnetRolesMapper;
import com.huikeportal.dao.AspnetUsersMapper;
import com.huikeportal.dao.LoginMapper;
import com.huikeportal.model.AspnetRoles;
import com.huikeportal.model.AspnetUsers;
import com.huikeportal.model.MenuInfo;
import com.huikeportal.model.SiteAllInfo;
import com.huikeportal.model.UserInfo;
import com.huikeportal.model.WordBook;
import com.huikeportal.model.common.SqlParameter;
import com.huikeportal.service.LoginService;

@Service("loginService")
public class LoginServiceImpl implements LoginService {

	@Autowired
	private LoginMapper loginMapper;

	@Autowired
	private AspnetRolesMapper aspnetRolesMapper;

	@Autowired
	private AspnetUsersMapper aspnetUsersMapper;

	/**
	 * 验证用户名密码
	 */
	public String loginValidate(UserInfo userInfo) throws Exception {
		String message = "";
		String passWord = userInfo.getPassWord();
		userInfo = loginMapper.getUserByName(userInfo);
		if (userInfo == null) {
			message = "用户名不存在，请重新输入！";
		} else if (!MD5Util.GetMD5Code(passWord).equals(userInfo.getPassWord())) {
			message = "用户名/密码错误，请重新输入！";
		} else if ("0".equals(userInfo.getCustomerStatus())
				|| "4".equals(userInfo.getCustomerStatus())
				|| "3".equals(userInfo.getCustomerStatus())
				|| !"1".equals(userInfo.getIsPCLogin())) {
			message = "用户名不存在，请重新输入！";
		} else if ("1".equals(userInfo.getIsLockOut())
				|| "2".equals(userInfo.getCustomerStatus())) {
			message = "该用户已被锁定，请联系系统管理员！";
		}
		return message;
	}

	/**
	 * 获取用户信息
	 */
	public UserInfo getUserInfo(UserInfo userInfo) throws Exception {
		return loginMapper.getUserByName(userInfo);
	}

	/**
	 * 获取菜单html
	 */
	public String getMenuHtml(UserInfo userInfo, String address)
			throws Exception {
		userInfo = loginMapper.getUserByName(userInfo);
		// 如果当前角色的用户id为空，则递归查找其顶级角色的用户id
		if ("".equals(userInfo.getUserCustomId())
				|| userInfo.getUserCustomId() == null) {
			AspnetRoles aspnetRoles = aspnetRolesMapper
					.selectByPrimaryKey(userInfo.getId());
			// 获取系统管理员角色id
			Long adminRoleId = loginMapper.getAdminRoleId();
			Long fatherRoleId = getUserType(aspnetRoles, adminRoleId);
			userInfo.setUserCustomId(aspnetRolesMapper.selectByPrimaryKey(
					fatherRoleId).getCustomerid());
		}
		// 获取当前登录用户拥有的菜单权限
		List<MenuInfo> roleMenuList = loginMapper.getMenuPermission(userInfo);
		// 菜单过滤(需求变更，不过滤，2015年10月8日09:24:18)
		// roleMenuList = menuFilter(roleMenuList, userInfo);
		// 获取所有的一级菜单权限
		List<MenuInfo> menuList = loginMapper
				.getMenuList(userInfo.getSysLang());
		return createMenuList(roleMenuList, menuList, address);
	}

	/**
	 * 递归获取当前用户角色的顶级角色
	 * 
	 * @param userInfo
	 * @return
	 * @throws Exception
	 */
	private Long getUserType(AspnetRoles aspnetRoles, Long adminRoleId)
			throws Exception {
		if (aspnetRoles.getParentid() != adminRoleId) {
			AspnetRoles roles = new AspnetRoles();
			roles.setId(aspnetRoles.getParentid());
			roles = aspnetRolesMapper.selectByPrimaryKey(roles.getId());
			return getUserType(roles, adminRoleId);
		}
		return aspnetRoles.getId();
	}

	/**
	 * 生成菜单List
	 * 
	 * @param roleMenuList
	 *            当前角色所拥有的菜单权限列表
	 * @param menuList
	 *            所有一级菜单列表
	 * @return
	 */
	private String createMenuList(List<MenuInfo> roleMenuList,
			List<MenuInfo> menuList, String address) {
		// 定义左侧菜单列表
		List<MenuInfo> leftMenuList = new ArrayList<MenuInfo>();
		// 循环所有一级菜单列表
		for (int i = 0; i < menuList.size(); i++) {
			// 循环当前角色拥有的菜单列表
			for (int j = 0; j < roleMenuList.size(); j++) {
				// 如果存在对应上级菜单id，则加入左侧菜单列表
				if (roleMenuList.get(j).getParentId().equals(
						menuList.get(i).getMenuId())) {
					leftMenuList.add(menuList.get(i));
					break;
				}
			}
		}
		// 将一级菜单按照idx排序
		Collections.sort(leftMenuList);
		// 循环左侧菜单列表
		for (int i = 0; i < leftMenuList.size(); i++) {
			List<MenuInfo> childList = new ArrayList<MenuInfo>();
			for (int j = 0; j < roleMenuList.size(); j++) {
				if (roleMenuList.get(j).getParentId().equals(
						leftMenuList.get(i).getMenuId())) {
					childList.add(roleMenuList.get(j));
				}
			}
			// 将子菜单排序
			Collections.sort(childList);
			if (address == null) {
				address = childList.get(0).getUrl();
			}
			leftMenuList.get(i).setMenuList(childList);
		}
		return createTreeHtml(leftMenuList, address);
	}

	/**
	 * 创建树形html
	 * 
	 * @param menuList
	 * @return
	 */
	private String createTreeHtml(List<MenuInfo> menuList, String address) {
		String menuHtml = "<div id='Left1_divmenu' class='floatleft leftdiv'>";
		for (int i = 0; i < menuList.size(); i++) {
			if (menuList.get(i).getMenuId() == 1) {
				menuHtml += "<div class='menu1'><div class='floatleft menu1img'><img src='"
						+ menuList.get(i).getUrl()
						+ "' style='width:2.1875em; height:5em;' /></div><div class='floatleft keliuwz bold'><span class='font24'>"
						+ menuList.get(i).getMenuNameNote()
						+ "</span></div>"
						+ "<div class='cleardiv'></div></div>";
			} else {
				menuHtml += "<div id='sol"
						+ menuList.get(i).getMenuId()
						+ "' class='menu1'><div class='floatleft menu1img'><img src='"
						+ menuList.get(i).getUrl()
						+ "' style='width:2.1875em; height:5em;' /></div><div class='floatleft keliuwz bold'><span class='font24'>"
						+ menuList.get(i).getMenuNameNote()
						+ "</span></div><div class='cleardiv'></div></div>";
			}
			// menuHtml += "<div class='menuxian'></div>";
			// 拼接子菜单html
			List<MenuInfo> childList = menuList.get(i).getMenuList();
			String childHtml = "";
			for (int j = 0; j < childList.size(); j++) {
				if (address.indexOf(childList.get(j).getUrl()) != -1) {
					childHtml += "<div id='ml"
							+ childList.get(j).getIdx()
							+ "' onclick='window.location.href="
							+ "\""
							+ childList.get(j).getUrl()
							+ "\""
							+ "' class='menu2click regular'><div style='padding-top:1.25em;width:100%;height:100%;'><span class='font24'>"
							+ childList.get(j).getMenuNameNote()
							+ "</span></div></div>";
				} else {
					childHtml += "<div id='ml"
							+ childList.get(j).getIdx()
							+ "' onclick='window.location.href="
							+ "\""
							+ childList.get(j).getUrl()
							+ "\""
							+ "' class='menu2 regular'><div style='padding-top:1.25em;width:100%;height:100%;'><span class='font24'>"
							+ childList.get(j).getMenuNameNote()
							+ "</span></div></div>";
				}
			}
			childHtml += "<div class='menuxian'></div>";
			menuHtml += "<div id='menu2sol" + menuList.get(i).getMenuId()
					+ "'>" + childHtml + "</div>";
		}
		menuHtml += "</div>";
		return menuHtml;
	}

	// /**
	// * 根据各用户类型功能权限进行菜单过滤
	// *
	// * @param roleMenuList
	// * @return
	// * @throws Exception
	// */
	// private List<MenuInfo> menuFilter(List<MenuInfo> roleMenuList,
	// UserInfo userInfo) throws Exception {
	// // 结果集菜单
	// List<MenuInfo> resultList = new ArrayList<MenuInfo>();
	// // 一级菜单列表
	// List<MenuInfo> oneList = new ArrayList<MenuInfo>();
	// // 二级菜单列表
	// List<MenuInfo> twoList = new ArrayList<MenuInfo>();
	// // 筛选二级菜单
	// for (int i = 0; i < roleMenuList.size(); i++) {
	// // 如果菜单不是一级菜单，判断权限
	// if (roleMenuList.get(i).getMenuType() == 2) {
	// // 用户类型
	// Integer customType = 0;
	// // 场所权限
	// String place = "";
	// // 页面区域
	// String area = "";
	// // 页面编号
	// String page = "";
	// // 根据用户的customid查询用户类型
	// if ("合作咨询".equals(userInfo.getUserType())) {
	// customType = 6;
	// } else {
	// customType = customerAllInfoMapper.selectByPrimaryKey(
	// userInfo.getUserCustomId()).getCustomertype();
	// }
	// // 根据用户场所权限判断用户当前属于哪个场所(集团、广场、店铺)
	// if ("1".equals(userInfo.getUserType())) {
	// place = null;
	// } else {
	// // 根据用户id查询该用户场所权限
	// List<String> siteList = loginMapper.getSitePerById(userInfo
	// .getUserId());
	// // 如果没有场所权限(数据错误)
	// if (siteList.size() == 0) {
	// place = null;
	// } else {
	// String pl = loginMapper.getSiteFa(siteList.get(0));
	// // 集团
	// if ("100".equals(pl)) {
	// place = "jt";
	// }
	// // 地域
	// if ("200".equals(pl)) {
	// place = null;
	// }
	// // 广场
	// if ("300".equals(pl)) {
	// place = "gc";
	// }
	// // 根节点
	// if ("0".equals(pl)) {
	// place = "jt";
	// }
	// }
	// }
	// // 获取当前页面区域
	// if (roleMenuList.get(i).getParentId() == 1) {
	// area = "data";
	// }
	// if (roleMenuList.get(i).getParentId() == 2) {
	// area = "report";
	// }
	// if (roleMenuList.get(i).getParentId() == 3) {
	// area = "area";
	// }
	// if (roleMenuList.get(i).getParentId() == 6) {
	// area = "config";
	// }
	// // 设置页面编号
	// page = roleMenuList.get(i).getIdx().toString();
	// // 如果有该页面权限，则加入二级菜单列表
	// if ("Y".equals(pageFilt(customType, place, area, page))) {
	// twoList.add(roleMenuList.get(i));
	// }
	// }
	// }
	// // 筛选一级菜单
	// for (int j = 0; j < roleMenuList.size(); j++) {
	// if (roleMenuList.get(j).getMenuId() == 7) {
	// oneList.add(roleMenuList.get(j));
	// continue;
	// }
	// // 如果是一级菜单，判断其是否还有下级菜单权限
	// if (roleMenuList.get(j).getMenuType() == 1) {
	// boolean flag = false;
	// for (int k = 0; k < twoList.size(); k++) {
	// if (twoList.get(k).getParentId() == roleMenuList.get(j)
	// .getMenuId()) {
	// flag = true;
	// break;
	// }
	// }
	// if (flag) {
	// oneList.add(roleMenuList.get(j));
	// }
	// }
	// }
	// // 最后确定的菜单
	// resultList.addAll(oneList);
	// resultList.addAll(twoList);
	// return resultList;
	// }

	// /**
	// * 根据用户类型、场所权限、菜单名称判断用户是否有该权限
	// *
	// * @param userType
	// * 用户类型(连锁购物中心、单体购物中心、连锁店、第三方(合作咨询))
	// * @param place
	// * 场所权限(集团、广场、店铺)
	// * @param page
	// * 菜单名称(二级菜单)
	// * @return
	// */
	// private String pageFilt(Integer userType, String place, String area,
	// String page) {
	// // 如果是连锁购物中心、连锁百货、单体购物中心、百货的广场用户，没有全局分析和品牌分析
	// if (userType == 1 || userType == 5 || userType == 2 || userType == 3) {
	// // 如果是广场用户
	// if ("gc".equals(place)) {
	// // 没有全局分析页面
	// if ("data".equals(area) && "5".equals(page)) {
	// return "N";
	// }
	// // 没有品牌分析页面
	// else if ("report".equals(area) && "1".equals(page)) {
	// return "N";
	// }
	// }
	// }
	// // 如果是连锁店的集团用户
	// else if (userType == 1) {
	// // 如果是集团用户
	// if ("jt".equals(place)) {
	// // 如果是我的数据菜单
	// if ("data".equals(area)) {
	// if ("6".equals(page) || "7".equals(page)
	// || "8".equals(page) || "9".equals(page)) {
	// return "N";
	// }
	// }
	// // 没有品牌分析页面
	// else if ("report".equals(area) && "1".equals(page)) {
	// return "N";
	// }
	// }
	// }
	// // 如果是第三方
	// else if (userType == 6) {
	// if ("data".equals(area)) {
	// if ("5".equals(page) || "6".equals(page) || "7".equals(page)
	// || "8".equals(page) || "9".equals(page)) {
	// return "N";
	// }
	// } else if ("report".equals(area)) {
	// if ("2".equals(page) || "3".equals(page) || "4".equals(page)
	// || "5".equals(page) || "6".equals(page)) {
	// return "N";
	// }
	// } else if ("area".equals(area)) {
	// return "N";
	// } else if ("config".equals(area)) {
	// if ("4".equals(page) || "5".equals(page) || "6".equals(page)
	// || "7".equals(page)) {
	// return "N";
	// }
	// }
	// }
	//
	// return "Y";
	// }

	/**
	 * 获取当前登录用户拥有的第一个页面的跳转地址
	 */
	public List<String> selectFirstPageUrl(SqlParameter sqlParameter)
			throws Exception {
		return loginMapper.selectFirstPageUrl(sqlParameter);
	}

	public List<MenuInfo> getChildMenuList(String sysLang) throws Exception {
		return loginMapper.getChildMenuList(sysLang);
	}

	public List<MenuInfo> getMenuPermission(UserInfo userInfo) throws Exception {
		return loginMapper.getMenuPermission(userInfo);
	}

	/**
	 * 查询用户场所权限下所有店铺
	 * 
	 * @param userInfo
	 * @return
	 * @throws Exception
	 */
	public List<SiteAllInfo> getDpSiteList(UserInfo userInfo) throws Exception {
		userInfo = loginMapper.getUserByName(userInfo);
		HashSet<SiteAllInfo> dpList = new HashSet<SiteAllInfo>();
		List<SiteAllInfo> siteList = loginMapper.queryUserSiteList(userInfo);
		for (int i = 0; i < siteList.size(); i++) {
			// 如果有广场场所，则查询出该广场下所有的店铺
			if (siteList.get(i).getType() == 300) {
				List<SiteAllInfo> dpSite = getDpListByGc(siteList.get(i)
						.getSiteid());
				if (dpSite.size() > 0) {
					dpList.addAll(dpSite);
				}
			} else if (siteList.get(i).getType() == 600) {
				dpList.add(siteList.get(i));
			}
		}
		List<SiteAllInfo> sitList = new ArrayList<SiteAllInfo>(dpList);
		// dpList = removeList(dpList);
		return sitList;
	}

	/**
	 * List去重
	 * 
	 * @param siteList
	 * @return
	 */
	private List<SiteAllInfo> removeList(List<SiteAllInfo> siteList) {
		List<String> listTemp = new ArrayList<String>();
		Iterator<SiteAllInfo> it = siteList.iterator();
		while (it.hasNext()) {
			String a = it.next().getSiteid();
			if (listTemp.contains(a)) {
				it.remove();
			} else {
				listTemp.add(a);
			}
		}
		return siteList;
	}

	/**
	 * 根据广场查询旗下所有店铺信息
	 * 
	 * @param siteId
	 * @return
	 * @throws Exception
	 */
	private List<SiteAllInfo> getDpListByGc(String siteId) throws Exception {
		return loginMapper.getDpListByGc(siteId);
	}

	/**
	 * 查询用户场所权限下所有地域
	 * 
	 * @param userInfo
	 * @return
	 * @throws Exception
	 */
	public List<SiteAllInfo> getDySiteList(UserInfo userInfo) throws Exception {
		List<SiteAllInfo> dyList = new ArrayList<SiteAllInfo>();
		List<SiteAllInfo> siteList = loginMapper.queryUserSiteList(userInfo);
		for (int i = 0; i < siteList.size(); i++) {
			if (siteList.get(i).getType() == 200) {
				dyList.add(siteList.get(i));
			}
		}
		return dyList;
	}

	/**
	 * 查询用户场所权限下所有广场
	 * 
	 * @param userInfo
	 * @return
	 * @throws Exception
	 */
	public List<SiteAllInfo> getGcSiteList(UserInfo userInfo) throws Exception {
		List<SiteAllInfo> gcList = new ArrayList<SiteAllInfo>();
		List<SiteAllInfo> siteList = loginMapper.queryUserSiteList(userInfo);
		for (int i = 0; i < siteList.size(); i++) {
			if (siteList.get(i).getType() == 300) {
				gcList.add(siteList.get(i));
			}
		}
		return gcList;
	}

	/**
	 * 查询用户场所权限下所有集团
	 * 
	 * @param userInfo
	 * @return
	 * @throws Exception
	 */
	public List<SiteAllInfo> getJtSiteList(UserInfo userInfo) throws Exception {
		List<SiteAllInfo> jtList = new ArrayList<SiteAllInfo>();
		List<SiteAllInfo> siteList = loginMapper.queryUserSiteList(userInfo);
		for (int i = 0; i < siteList.size(); i++) {
			if (siteList.get(i).getType() == 100) {
				jtList.add(siteList.get(i));
			}
		}
		return jtList;
	}

	/**
	 * 查询用户场所权限所有楼层
	 */
	public List<SiteAllInfo> getLcSiteList(UserInfo userInfo) throws Exception {
		userInfo = loginMapper.getUserByName(userInfo);
		List<SiteAllInfo> lcList = new ArrayList<SiteAllInfo>();
		List<SiteAllInfo> siteList = loginMapper.queryUserSiteList(userInfo);
		for (int i = 0; i < siteList.size(); i++) {
			// 如果有广场场所，则查询出该广场下所有的楼层
			if (siteList.get(i).getType() == 300) {
				List<SiteAllInfo> lcSite = getLcListByGc(siteList.get(i)
						.getSiteid());
				if (lcSite.size() > 0) {
					lcList.addAll(lcSite);
				}
			} else if (siteList.get(i).getType() == 500) {
				lcList.add(siteList.get(i));
			}
		}
		lcList = removeList(lcList);
		return lcList;
	}

	/**
	 * 根据广场查询旗下所有的楼层
	 * 
	 * @param siteId
	 * @return
	 * @throws Exception
	 */
	private List<SiteAllInfo> getLcListByGc(String siteId) throws Exception {
		return loginMapper.getLcListByGc(siteId);
	}

	/**
	 * 查询用户场所权限所有区域
	 */
	public List<SiteAllInfo> getQySiteList(UserInfo userInfo) throws Exception {
		userInfo = loginMapper.getUserByName(userInfo);
		List<SiteAllInfo> qyList = new ArrayList<SiteAllInfo>();
		List<SiteAllInfo> siteList = loginMapper.queryUserSiteList(userInfo);
		for (int i = 0; i < siteList.size(); i++) {
			// 如果有广场场所，则查询出该广场下所有的区域
			if (siteList.get(i).getType() == 300) {
				List<SiteAllInfo> qySite = getQyListByGc(siteList.get(i)
						.getSiteid());
				if (qySite.size() > 0) {
					qyList.addAll(qySite);
				}
			} else if (siteList.get(i).getType() == 400) {
				qyList.add(siteList.get(i));
			}
		}
		qyList = removeList(qyList);
		return qyList;
	}

	/**
	 * 根据广场查询旗下所有的区域
	 * 
	 * @param siteId
	 * @return
	 * @throws Exception
	 */
	private List<SiteAllInfo> getQyListByGc(String siteId) throws Exception {
		return loginMapper.getQyListByGc(siteId);
	}

	/**
	 * 查询登录用户的权限页面按钮信息
	 */
	public List<WordBook> getUserButtonList(String sysLang, String userId,
			Integer menuId) throws Exception {
		SqlParameter sql = new SqlParameter();
		sql.setString(userId);
		sql.setSysLang(sysLang);
		sql.setStringInt(menuId);
		return loginMapper.getUserButtonList(sql);
	}

	/**
	 * 更新用户语言信息
	 */
	public void updateSysLang(UserInfo userInfo) throws Exception {
		AspnetUsers aspnetUsers = new AspnetUsers();
		aspnetUsers.setUserid(userInfo.getUserId());
		aspnetUsers.setUserLang(userInfo.getSysLang());
		aspnetUsersMapper.updateByPrimaryKeySelective(aspnetUsers);
	}

	/**
	 * 查询用户店铺广场
	 */
	public List<SiteAllInfo> getDpGcSiteList(UserInfo userInfo)
			throws Exception {
		userInfo = loginMapper.getUserByName(userInfo);
		HashSet<SiteAllInfo> dpGcList = new HashSet<SiteAllInfo>();
		List<SiteAllInfo> siteList = loginMapper.queryUserSiteList(userInfo);
		List<SiteAllInfo> dpList = new ArrayList<SiteAllInfo>();
		for (int i = 0; i < siteList.size(); i++) {
			if (siteList.get(i).getType() == 300) {
				dpGcList.add(siteList.get(i));
			} else if (siteList.get(i).getType() == 600) {
				dpList.add(siteList.get(i));
			}
		}
		dpGcList.addAll(loginMapper.getGcByDp(Tools.pinjieId(dpList)));
		List<SiteAllInfo> resultList = new ArrayList<SiteAllInfo>(dpGcList);
		return resultList;
	}

	// 查询用户仅店铺权限
	public List<SiteAllInfo> getJinDpSiteList(UserInfo userInfo)
			throws Exception {
		userInfo = loginMapper.getUserByName(userInfo);
		List<SiteAllInfo> dpList = new ArrayList<SiteAllInfo>();
		List<SiteAllInfo> siteList = loginMapper.queryUserSiteList(userInfo);
		for (int i = 0; i < siteList.size(); i++) {
			if (siteList.get(i).getType() == 600) {
				dpList.add(siteList.get(i));
			}
		}
		return dpList;
	}

}
